Gateway Intents の利用に関するガイド
これは特に間違いを含む可能性がある。
cacheという大きな状態に手を焼いていますtig.icon
以下も参照
GUILDS
現状これがないとギルドとギルドチャンネルがキャッシュに乗らない
discord.jsはこの2つがすべてキャッシュされている前提で書かれている
つまりこれがないとdiscordjsはまともに動かない
DMのみ扱うとかなら動くかも知れない
partialは一部のイベントにおいて効果を発揮しない
例えば
チャンネルがキャッシュに乗っていないとmessageCreateがそのチャンネルで発火しない
ギルドがキャッシュにのっていないとpresenceUpdateが発火しない
ロールの作成、更新、削除
チャンネルの作成や更新、削除
スレッドの作成や更新
ステージの開始や更新、終了
GUILD_MEMBERS
次のイベントを使用している場合
guildMemberAdd
guildMemberRemove
guildMemberUpdate
ただし、自身のニックネームの変更などの自身の情報の変更はこれを指定しなくても受け取れる
threadMembersUpdate
ただし、自身がスレッドに追加された場合はこれを指定しなくてもGUILDSがあれば受け取れる
サーバーのメンバーを全列挙している場合
guild.members.fetch()など
privileged intentsの"指定"は関係ない気がするyuta0801.icon
そういうトピックもまとめて扱いたかったのでタイトル変えましたtig.icon
Gateway APIにRequest Guild Membersがあったのを忘れた
サーバーの人数を利用している場合
ボットがAPIに接続したときの初期値は使えそうだが、更新がされない
更新はクライアント側でguildMemberAdd/Removeイベントを使ってカウントしてる
微妙に正確ではないけど理解としてはそうtig.icon
自動では更新されないので、最新の結果を得たいのなら毎回fetchすることになる
GUILD_BANS
例えば、以下のイベントを使用している場合
guildBanAdd
guildBanRemove
GUILD_EMOJIS_AND_STICKERS
例えば、以下のイベントを使用している場合
emojiCreate
emojiUpdate
emojiDelete
stickerCreate
stickerUpdate
stickerDelete
起動後に追加されたサーバー絵文字がリアクションとして追加/削除された場合に反応したい場合も必要かもしれない
わからんtig.icon
Unicode絵文字に反応したいだけならいらない
GUILD_INTEGRATIONS
例えば、以下のイベントを使用している場合
guildIntegrationsUpdate
GUILD_WEBHOOKS
例えば、以下のイベントを使用している場合
webhookUpdate
GUILD_INVITES
例えば、以下のイベントを使用している場合
inviteCreate
inviteDelete
GUILD_VOICE_STATES
例えば、以下のイベントを使用している場合
voiceStateUpdate
VoiceChannel#joinには影響しないはず v12 GUILD_PRESENCES
使う場合はGuild#fetchを呼び出すように実装する必要がある
自動では更新されないので、最新の結果を得たいのなら毎回fetchすることになる
GuildMemberManager#fetchにwithPresenceを指定するのもだめ
メンバー/ユーザーのキャッシュが必要な場合
指定しない場合、初期に送信されてくるユーザーの情報はVCにいるボットとユーザーのみになる
guild member addじゃなくてpresence updateなんだyuta0801.icon
If you are using Gateway Intents, members and presences returned in this event will only contain your bot and users in voice channels unless you specify the GUILD_PRESENCES intent.
あーそっちでもmembersが送信されるんだ
既存のメンバーはこっち。tig.icon
guild member addが(guild createと同じように)接続時にも呼び出されると誤解していた
指定してもすべてのメンバーの情報が来るわけではない
largeなギルドなど
回避策のアイデア
partialsを指定する
その上で次のようなメソッドを使う
GuildMember#fetch
User#fetch
以下のようなメソッドを使用する
GuildMemberManager#fetch
UserManager#fetch
GUILD_MESSAGES
ギルドのテキストベースなチャンネル(テキストチャンネル、ニュースチャンネル、スレッドチャンネル等)のメッセージの作成や削除、更新についての情報を受け取りたい場合 例えば、以下のイベントをギルドのテキストベースなチャンネルで使用している場合
messageUpdate
messageDelete
ただし、メッセージを対象としている場合
messageDeleteBulk
よって以下のものを利用するためにもこのIntentsが必要
GUILD_MESSAGE_REACTIONS
例えば、以下のイベントをギルドのテキストベースなチャンネルのメッセージで使用している場合
messageReactionAdd
messageReactionRemove
messageReactionRemoveAll
messageReactionRemoveEmoji
よって以下のものを利用するためにもこのIntentsが必要
GUILD_MESSAGE_TYPING
以下のイベントをサーバー内のチャンネルで使用している場合
typingStart
DIRECT_MESSAGES
gateway v8以降これはDMでは発火しない。
messageUpdate
messageDelete
messageDeleteBulk
DIRECT_MESSAGE_REACTIONS
messageReactionAdd
messageReactionRemove
messageReactionRemoveAll
messageReactionRemoveEmoji
DIRECT_MESSAGE_TYPING
typingStart